package com.tulingxueyuan.mall.modules.pms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tulingxueyuan.mall.modules.pms.model.*;
import com.tulingxueyuan.mall.modules.pms.mapper.PmsProductMapper;
import com.tulingxueyuan.mall.dto.ProductSaveDto;
import com.tulingxueyuan.mall.dto.ProductUpdateInitDto;
import com.tulingxueyuan.mall.modules.pms.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 商品信息 服务实现类
 * </p>
 *
 * @author SiXiaoLong
 * @since 2022-10-13
 */
@Service
public class PmsProductServiceImpl extends ServiceImpl<PmsProductMapper, PmsProduct> implements PmsProductService {
    @Autowired
    private PmsProductCategoryService pmsProductCategoryService;
    @Autowired
    private PmsMemberPriceService pmsMemberPriceService;
    @Autowired
    private PmsProductLadderService pmsProductLadderService;
    @Autowired
    private PmsProductFullReductionService pmsProductFullReductionService;
    @Autowired
    private PmsSkuStockService pmsSkuStockService;
    @Autowired
    private PmsProductAttributeValueService pmsProductAttributeValueService;
    @Autowired
    private PmsProductMapper pmsProductMapper;

    @Override
    public Page getPage(Integer verifyStatus, Integer publishStatus, Long brandId, String productSn, String keyword, Long productCategoryId, Integer pageNum, Integer pageSize) {
        LambdaQueryWrapper<PmsProduct> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(verifyStatus!=null,PmsProduct::getVerifyStatus,verifyStatus);
        lambdaQueryWrapper.eq(publishStatus!=null,PmsProduct::getPublishStatus,publishStatus);
        lambdaQueryWrapper.eq(brandId!=null,PmsProduct::getBrandId,brandId);
        lambdaQueryWrapper.eq(productCategoryId!=null,PmsProduct::getProductCategoryId,productCategoryId);
        lambdaQueryWrapper.like(StringUtils.isNoneBlank(productSn),PmsProduct::getProductSn,productSn);
        lambdaQueryWrapper.eq(StringUtils.isNoneBlank(keyword),PmsProduct::getKeywords,keyword);
        lambdaQueryWrapper.orderByDesc(PmsProduct::getSort);
        Page<PmsProduct> page = new Page<>(pageNum,pageSize);
        return this.page(page,lambdaQueryWrapper);
    }
/**
 * 根据map.get()取值 表示对应的上下架 是否新品 是否推荐等修改
 */

    @Override
    public boolean updateStatus(Map map) {
        List<String> ids = (List<String>) map.get("ids");
        LambdaUpdateWrapper<PmsProduct> luw = new LambdaUpdateWrapper<>();
        if (map.get("publishStatus")!=null){
//            说明是上下架功能
    //        pmsProductService.updateBatchById(ids);
            luw.set(PmsProduct::getPublishStatus,map.get("publishStatus").toString());
            luw.in(PmsProduct::getId,ids);
            this.update(luw);
            return true;
        }else if (map.get("recommendStatus")!=null){
//            说明是设为推荐功能
            //        pmsProductService.updateBatchById(ids);
            luw.set(PmsProduct::getRecommandStatus,map.get("recommendStatus").toString());
            luw.in(PmsProduct::getId,ids);
            this.update(luw);
            return true;
        } else if (map.get("newStatus")!=null) {
            //            说明是设为新品
            //        pmsProductService.updateBatchById(ids);
            luw.set(PmsProduct::getNewStatus,map.get("newStatus").toString());
            luw.in(PmsProduct::getId,ids);
            this.update(luw);
            return true;
        }
        return false;
    }

    /**
     * 保存商品
     */
    @Override
    @Transactional
    public boolean create(ProductSaveDto productSaveDto) {
//       保存商品的基本信息  --商品主表
        productSaveDto.setId(null);
        boolean b = this.save(productSaveDto);
        if (b){
//            为了解决 前端会传入其他促销方式的空数据进来
            switch (productSaveDto.getPromotionType()){
                case 2:
                    //        保存会员价格
                    saveManyList(productSaveDto.getMemberPricesList(),productSaveDto.getId(),pmsMemberPriceService);
                    break;
                case 3:
                    //        ·阶梯价格
                    saveManyList(productSaveDto.getProductLadderList(),productSaveDto.getId(),pmsProductLadderService);
                    break;
                case 4:
                    //        满减价格
                    saveManyList(productSaveDto.getProductFullReductionList(),productSaveDto.getId(),pmsProductFullReductionService);
                    break;

            }
            //        sku
            saveManyList(productSaveDto.getSkuStockList(),productSaveDto.getId(),pmsSkuStockService);
            //        ，spu
            saveManyList(productSaveDto.getProductAttributeValueList(),productSaveDto.getId(),pmsProductAttributeValueService);
        }
        return b;
    }

    /**
     * 公共方法  保存会员价格·阶梯价格·满减价格 ·sku，spu商品的关联数据
     * 统一：都需要设置productId  并且保存到对应表里
     */
    public void saveManyList(List list, Long productId, IService service){
//        如果数据为空或者长度为0  直接返回
        if (CollectionUtils.isEmpty(list)) return;
        list.forEach(e -> {
            try {
//                反射原理  为每个类 赋值productId
                Method setProductIdMethod = e.getClass().getMethod("setProductId", Long.class);
                setProductIdMethod.invoke(e, productId);
//                修改状态下要把每个关联的主键id清除掉
//                Method setId = e.getClass().getMethod("setId", Long.class);
//                setId.invoke(e,(Long)null);
            } catch (Exception ex) {
                throw  new RuntimeException(ex);
            }
        });
        service.saveBatch(list);
    }

    /**
     * 根据id查询商品信息  mp版
     */
//    @Override
//    public ProductUpdateInitDto get(Long id) {
//        PmsProduct pmsProduct = this.getById(id);
//        ProductUpdateInitDto ProductUpdateInitDto = new ProductUpdateInitDto();
//        BeanUtils.copyProperties(pmsProduct,ProductUpdateInitDto);
////        根据二级id  查询一级id
//        PmsProductCategory pmsProductCategoryServiceById = pmsProductCategoryService.getById(ProductUpdateInitDto.getProductCategoryId());
//        ProductUpdateInitDto.setCateParentId(pmsProductCategoryServiceById.getParentId());
////        商品属性相关
//        LambdaQueryWrapper<PmsProductAttributeValue> lqw = new LambdaQueryWrapper<>();
//        lqw.eq(PmsProductAttributeValue::getProductId,id);
//        List<PmsProductAttributeValue> pmsProductAttributeValues = pmsProductAttributeValueService.list(lqw);
//        ProductUpdateInitDto.setProductAttributeValueList(pmsProductAttributeValues);
////          商品sku库存信息
//        LambdaQueryWrapper<PmsSkuStock> lqw1 = new LambdaQueryWrapper<>();
//        lqw1.eq(PmsSkuStock::getProductId,id);
//        List<PmsSkuStock> PmsSkuStocks = pmsSkuStockService.list(lqw1);
//        ProductUpdateInitDto.setSkuStockList(PmsSkuStocks);
////          商品满减
//        LambdaQueryWrapper<PmsProductFullReduction> lqw2 = new LambdaQueryWrapper<>();
//        lqw2.eq(PmsProductFullReduction::getProductId,id);
//        List<PmsProductFullReduction> PmsProductFullReductions = pmsProductFullReductionService.list(lqw2);
//        ProductUpdateInitDto.setProductFullReductionList(PmsProductFullReductions);
////          会员价格
//        LambdaQueryWrapper<PmsMemberPrice> lqw3 = new LambdaQueryWrapper<>();
//        lqw3.eq(PmsMemberPrice::getProductId,id);
//        List<PmsMemberPrice> PmsMemberPrice = pmsMemberPriceService.list(lqw3);
//        ProductUpdateInitDto.setMemberPricesList(PmsMemberPrice);
////          商品阶梯价格
//        LambdaQueryWrapper<PmsProductLadder> lqw4 = new LambdaQueryWrapper<>();
//        lqw4.eq(PmsProductLadder::getProductId,id);
//        List<PmsProductLadder> PmsProductLadder = pmsProductLadderService.list(lqw4);
//        ProductUpdateInitDto.setProductLadderList(PmsProductLadder);
//        return ProductUpdateInitDto;
//    }

    /**
     * 根据id查询商品信息  xml版
     */
    @Override
    public ProductUpdateInitDto get(Long id) {
        ProductUpdateInitDto productUpdateInitDto = pmsProductMapper.get(id);
        return productUpdateInitDto;
    }
    /**
     * 根据id修改商品
     */
    @Override
    @Transactional
    public boolean updateProduct(Long id, ProductSaveDto productSaveDto) {
        productSaveDto.setId(id);
        //       更新商品的基本信息  --商品主表
        boolean b = this.updateById(productSaveDto);
        if (b){
//            为了解决 前端会传入其他促销方式的空数据进来
            switch (productSaveDto.getPromotionType()){
                case 2:
                    //        保存会员价格
//                    为了知道用户选了什么  所以要先删除全部在插入
                    DeleteManyListByProductId(id,pmsMemberPriceService);
                    saveManyList(productSaveDto.getMemberPricesList(),productSaveDto.getId(),pmsMemberPriceService);
                    break;
                case 3:
                    //        ·阶梯价格
                    DeleteManyListByProductId(id,pmsProductLadderService);
                    saveManyList(productSaveDto.getProductLadderList(),productSaveDto.getId(),pmsProductLadderService);
                    break;
                case 4:
                    //        满减价格
                    DeleteManyListByProductId(id,pmsProductFullReductionService);
                    saveManyList(productSaveDto.getProductFullReductionList(),productSaveDto.getId(),pmsProductFullReductionService);
                    break;

            }
            //        sku
            DeleteManyListByProductId(id,pmsSkuStockService);
            saveManyList(productSaveDto.getSkuStockList(),productSaveDto.getId(),pmsSkuStockService);
            //        ，spu
            DeleteManyListByProductId(id,pmsProductAttributeValueService);
            saveManyList(productSaveDto.getProductAttributeValueList(),productSaveDto.getId(),pmsProductAttributeValueService);
        }
        return b;
    }

    /**
     * 删除对应id的信息
     */
    public void DeleteManyListByProductId(Long productId, IService service) {
        QueryWrapper lqw = new QueryWrapper();
        lqw.eq("product_id", productId);
        service.remove(lqw);
    }
}
